﻿Imports FairShop.Helpers
Imports FairShop.Operaties
Imports System.ComponentModel
Imports System.IO
Imports System.Windows.Forms

Public Class MainForm

    Public _splashScreen As SplashForm
    Private _kasbladScherm As VerkoopDetailsForm
    Private _prf As PerformantieHelper

#Region "Constructors"

    Public Sub New()

        ' This call is required by the Windows Form Designer.
        InitializeComponent()

        _prf = New PerformantieHelper("Opstarten MainForm")

        ' als dit een nieuwe versie van de software is, moeten de usersettings 
        ' van de vorige versie geupgradet worden, anders gaan ze verloren.
        If (Not My.Settings.isAlreadyUpgraded) Then
            My.Settings.Upgrade()
            My.Settings.isAlreadyUpgraded = True
            My.Settings.Save()
        End If
        My.Settings.PrepareConnectionString()
        Me.GroupBoxBasis.Enabled = False
    End Sub

    Protected Overrides Sub OnLoad(ByVal e As EventArgs)
        MyBase.OnLoad(e)
        Dim shouldClose As Boolean = False
        Try
            Cursor = Cursors.WaitCursor

            Me.Hide()
            _splashScreen = New SplashForm()
            _splashScreen.Show()
            _splashScreen.Update()
            Application.DoEvents()
            log.WriteInfo("Bezig op te starten")
            ' zorg ervoor dat de dataset opgehaald wordt
            Utility.InitializeData()

            If (Utility.IsOefenVersie()) Then
                lblVersie.Text = String.Format("FairShop{0}Oefenversie {1}", Environment.NewLine, Application.ProductVersion)
            Else
                lblVersie.Text = String.Format("FairShop{0}Versie {1}", Environment.NewLine, Application.ProductVersion)
            End If

            If (Utility.IsOefenVersie()) Then
                Me.Text = "FairShop - Oefenwinkel" ' om al te tonen tijdens aanloggen
                Me.BackColor = Utility.GetOefenVersieColor()
            End If

            If (Configuratie.ToonMonitor) Then
                Dim monitor As New DataMonitorForm()
                monitor.Show()
            End If

            'Me.UpdatesBackgroundWorker.RunWorkerAsync() ' veroorzaakt mogelijk fouten tijdens opstarten, mag later weg
            Me.UpdatesBackgroundWorker_DoWork(Me, New DoWorkEventArgs(Nothing)) ' doe updates zonder aparte thread

            _prf.LogMeting()
            _splashScreen.Close()
            Me.Visible = True

            Dim f As New NaamWinkelierForm(_prf)
            If Not (f.ShowDialog() = DialogResult.OK) Then
                Application.Exit()
                Return
            End If

            ToonOnderdelenAfhankelijkVanGebruiker()

            If (Not Utility.IsOefenVersie()) Then
                'Me.BackupBackgroundWorker.RunWorkerAsync() ' veroorzaakt mogelijk fouten tijdens opstarten, mag later weg
                Me.BackupBackgroundWorker_DoWork(Me, New DoWorkEventArgs(Nothing))  ' doe back-up zonder aparte thread
                Me.Text = String.Format("FairShop - {0}", Security.HuidigeWinkelierNaam)
                log.WriteInfo("Opgestart")
            Else
                Me.Text = String.Format("FairShop - Oefenwinkel - {0}", Security.HuidigeWinkelierNaam)
                log.WriteInfo("Opgestart met oefenwinkel")
            End If

            If (MeldingenHelper.MoetMeldingGetoondWorden()) Then
                Dim f2 As New MeldingForm()
                f2.ShowDialog()
            End If

            If (Security.IsWinkelierZonderMeerRechten()) Then
                ' indien geen administrator, recht naar verkopen gaan
                shouldClose = ToonNieuwKasblad()
            End If
        Finally
            If (shouldClose) Then
                Me.Close()
            Else
                Cursor = Cursors.Default
                Me.Visible = True
            End If
        End Try
    End Sub

#End Region

#Region "Event handling"

    Private Sub btnSluiten_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnSluiten.Click
        If (_kasbladScherm IsNot Nothing) Then
            MsgBox.ShowWarning("Er staat nog een winkelverkoop open in een ander venster. Sluit deze eerst af.")
            Return
        End If
        Me.Close()
    End Sub

    Protected Overrides Sub OnKeyUp(ByVal e As KeyEventArgs)
        MyBase.OnKeyUp(e)
        Select Case e.KeyCode
            Case Keys.F2
                ToonNieuwKasblad()
            Case Keys.F3
                ToonNieuwKasbladTussendoor()
            Case Keys.F4
                ToonVoorraadBewegingenScherm()
            Case Keys.L
                ToonLeveringenScherm()
            Case Keys.F5
                ToonToonArtikels()
            Case Keys.F6
                ToonBeheerWinkeliersScherm()
            Case Keys.F7
                ToonBeheerVerkopen()
            Case Keys.F8
                ToonBeheerInventaris()
            Case Keys.F9
                ToonBeheerCategorieen()
            Case Keys.F10
                ToonBeheerLeveranciers()
            Case Keys.F11
                ToonBeheerKlanten()
            Case Keys.F
                ToonBeheerLeveringsbonnen()
            Case Keys.S
                ToonInstellingen()
            Case Keys.I
                Me.ToonImporteerPrijzen()
            Case Keys.B
                Me.ToonAanmaakBarcodesScherm()
            Case Keys.T
                Me.ToonToolsScherm()
            Case Keys.F12
                Me.Close()
        End Select
    End Sub
    Private Sub llBeheerInstellingen_LinkClicked(ByVal sender As Object, ByVal e As LinkLabelLinkClickedEventArgs) Handles llBeheerInstellingen.LinkClicked
        ToonInstellingen()
    End Sub
    Private Sub llNieuwKasblad_LinkClicked(ByVal sender As Object, ByVal e As LinkLabelLinkClickedEventArgs) Handles llNieuwKasblad.LinkClicked
        ToonNieuwKasblad()
    End Sub
    Private Sub llTussendoor_LinkClicked(ByVal sender As Object, ByVal e As LinkLabelLinkClickedEventArgs) Handles llTussendoor.LinkClicked
        ToonNieuwKasbladTussendoor()
    End Sub
    Private Sub llVoorraadbewegingen_LinkClicked(ByVal sender As Object, ByVal e As LinkLabelLinkClickedEventArgs) Handles llVoorraadbewegingen.LinkClicked
        ToonVoorraadBewegingenScherm()
    End Sub
    Private Sub llLeveringen_LinkClicked(ByVal sender As Object, ByVal e As LinkLabelLinkClickedEventArgs) Handles llLeveringen.LinkClicked
        ToonLeveringenScherm()
    End Sub
    Private Sub llBarcodes_LinkClicked(ByVal sender As Object, ByVal e As LinkLabelLinkClickedEventArgs) Handles llBarcodes.LinkClicked
        ToonAanmaakBarcodesScherm()
    End Sub
    Private Sub llBeheerWinkeliers_LinkClicked(ByVal sender As Object, ByVal e As LinkLabelLinkClickedEventArgs) Handles llBeheerWinkeliers.LinkClicked
        ToonBeheerWinkeliersScherm()
    End Sub
    Private Sub llBeheerArtikels_LinkClicked(ByVal sender As Object, ByVal e As LinkLabelLinkClickedEventArgs) Handles llBeheerArtikels.LinkClicked
        ToonToonArtikels()
    End Sub
    Private Sub llInventaris_LinkClicked(ByVal sender As Object, ByVal e As LinkLabelLinkClickedEventArgs) Handles llInventaris.LinkClicked
        ToonBeheerInventaris()
    End Sub
    Private Sub llBeheerCategorieen_LinkClicked(ByVal sender As Object, ByVal e As LinkLabelLinkClickedEventArgs) Handles llBeheerCategorieen.LinkClicked
        ToonBeheerCategorieen()
    End Sub
    Private Sub llBeheerLeveranciers_LinkClicked(ByVal sender As Object, ByVal e As LinkLabelLinkClickedEventArgs) Handles llBeheerLeveranciers.LinkClicked
        ToonBeheerLeveranciers()
    End Sub
    Private Sub llBeheerVerkopen_LinkClicked(ByVal sender As Object, ByVal e As LinkLabelLinkClickedEventArgs) Handles llBeheerVerkopen.LinkClicked
        Me.ToonBeheerVerkopen()
    End Sub
    Private Sub llBeheerKlanten_LinkClicked(ByVal sender As Object, ByVal e As LinkLabelLinkClickedEventArgs) Handles llBeheerKlanten.LinkClicked
        Me.ToonBeheerKlanten()
    End Sub
    Private Sub llPrijslijstImporteren_LinkClicked(ByVal sender As Object, ByVal e As LinkLabelLinkClickedEventArgs) Handles llPrijslijstImporteren.LinkClicked
        Me.ToonImporteerPrijzen()
    End Sub
    Private Sub llSamengesteldeArtikels_LinkClicked(ByVal sender As Object, ByVal e As LinkLabelLinkClickedEventArgs) Handles llSamengesteldeArtikels.LinkClicked
        Me.BeheerSamengesteldeArtikels()
    End Sub
    Private Sub llLeeggoedVanArtikels_LinkClicked(ByVal sender As Object, ByVal e As LinkLabelLinkClickedEventArgs) Handles llLeeggoedVanArtikels.LinkClicked
        Me.BeheerLeeggoedVanArtikels()
    End Sub

    Private Sub llTools_LinkClicked(ByVal sender As Object, ByVal e As LinkLabelLinkClickedEventArgs) Handles llTools.LinkClicked
        Me.ToonToolsScherm()
    End Sub

    Private Sub llBeheerLeveringsbonnen_LinkClicked(ByVal sender As Object, ByVal e As LinkLabelLinkClickedEventArgs) Handles llBeheerLeveringsbonnen.LinkClicked
        Me.ToonBeheerLeveringsbonnen()
    End Sub

    Private Sub llVerkoopsRapport_LinkClicked(ByVal sender As Object, ByVal e As LinkLabelLinkClickedEventArgs) Handles llVerkoopsRapport.LinkClicked
        ToonVerkoopsRapport()
    End Sub

    Private Sub llInventarisRapport_LinkClicked(ByVal sender As Object, ByVal e As LinkLabelLinkClickedEventArgs) Handles llInventarisRapport.LinkClicked
        ToonInventarisRapport()
    End Sub

    Private Sub llArtikelRapport_LinkClicked(ByVal sender As Object, ByVal e As LinkLabelLinkClickedEventArgs) Handles llArtikelRapport.LinkClicked
        ToonArtikelRapport()
    End Sub

    Private Sub llVerkoopsoverzicht_LinkClicked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.LinkLabelLinkClickedEventArgs) Handles llVerkoopsoverzicht.LinkClicked
        ToonVerkoopsoverzicht()
    End Sub

    Private Sub BackupBackgroundWorker_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs) Handles BackupBackgroundWorker.DoWork
        Backup.MaakBackup()
    End Sub

    Private Sub UpdatesBackgroundWorker_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs) Handles UpdatesBackgroundWorker.DoWork
        ' haal nieuwe prijzen binnen indien nodig
        Dim dal As New ImportDal()
        Dim aantalBijgewerkt As Integer = dal.ImporteerFase2()
        log.WriteInfo(String.Format("Automatisch bijwerken van prijzen: {0} artikels werden bijgewerkt.", aantalBijgewerkt))
    End Sub

    ''' <summary>
    ''' Zorgt ervoor dat het kasbladscherm de focus krijgt als het programma geactiveerd wordt
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks>Dit is bedoeld voor als het programma geactiveerd wordt met AltGr+F of AltGr+O.
    ''' Dit zorgt ervoor dat dan onmiddellijk kan ingescand worden (focus op kasblad en focus op barcodevak).</remarks>
    Private Sub MainForm_Activated(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Activated
        If (Security.IsWinkelierZonderMeerRechten()) Then
            If (_kasbladScherm IsNot Nothing) Then
                _kasbladScherm.Focus()
            End If
        End If
    End Sub

    Private Sub OnKasbladClosed(ByVal sender As Object, ByVal e As FormClosedEventArgs)
        Me.llNieuwKasblad.Enabled = True
        Me.llTussendoor.Enabled = True
        _kasbladScherm = Nothing
    End Sub

#End Region

#Region "Helperfuncties"

    ''' <summary>
    ''' 
    ''' </summary>
    ''' <returns>True als het hoofdvenster vervolgens gesloten moet worden</returns>
    Private Function ToonNieuwKasblad() As Boolean
        If (Not Utility.CanOpenOtherFormCheck()) Then Return False
        Try
            Cursor = Cursors.WaitCursor

            ' gebruik het eindtotaal van de vorige (kas)verkoop als begintotaal van deze verkoop
            Dim eindTotaalVorigeVerkoop As Decimal = ArtikelsBL.LaatsteVerkoopEindTotaalOphalen()

            Dim tellingScherm As New TellingForm(eindTotaalVorigeVerkoop, TellingForm.SoortTelling.Begin)
            If (tellingScherm.ShowDialog() = DialogResult.OK) Then
                _kasbladScherm = New VerkoopDetailsForm(tellingScherm.Totaal, tellingScherm.Opmerkingen, tellingScherm.TellingTabel)
                If (Security.IsWinkelierZonderMeerRechten) Then
                    _kasbladScherm.ShowInTaskbar = False
                    '_kasbladScherm.TopMost = True
                    _kasbladScherm.ShowDialog()

                    ' bij gewone winkelier na het sluiten van kasblad, alles sluiten
                    Return True
                Else
                    _kasbladScherm.ShowInTaskbar = True
                    ' zorg ervoor dat je wel bv. Leveringen kan opstarten, 
                    ' maar niet nogmaals een nieuw kasblad of tussendoor.
                    Me.llNieuwKasblad.Enabled = False
                    Me.llTussendoor.Enabled = False
                    AddHandler _kasbladScherm.FormClosed, AddressOf Me.OnKasbladClosed
                    _kasbladScherm.Show()
                    Return False
                End If
            End If
        Catch ex As Exception
            MsgBox.ShowError("Fout tijdens het aanmaken van een nieuw kasblad")
            log.WriteError(ex.ToString())
        Finally
            Cursor = Cursors.Default
        End Try
        Return False
    End Function

    Private Sub ToonNieuwKasbladTussendoor()
        If (Not Utility.CanOpenOtherFormCheck()) Then Return
        Try
            Cursor = Cursors.WaitCursor
            _kasbladScherm = New VerkoopDetailsForm()
            AddHandler _kasbladScherm.FormClosed, AddressOf Me.OnKasbladClosed
            _kasbladScherm.ShowDialog()
        Catch ex As Exception
            MsgBox.ShowError("Fout tijdens het aanmaken van een nieuw kasblad")
            log.WriteError(ex.ToString())
        Finally
            Cursor = Cursors.Default
        End Try
    End Sub

    Private Sub ToonVoorraadBewegingenScherm()
        If (Not Utility.CanOpenOtherFormCheck()) Then Return
        Cursor = Cursors.WaitCursor
        Dim f As New VoorraadBewegingenForm(Me)
        f.ShowDialog()
        Cursor = Cursors.Default
    End Sub

    Private Sub ToonLeveringenScherm()
        If (Not Utility.CanOpenOtherFormCheck()) Then Return
        Cursor = Cursors.WaitCursor
        Dim f As New LeveringenForm(Me)
        f.ShowInTaskbar = True
        f.Show() ' geen ShowDialog, zodat het naast kasblad kan draaien
        Cursor = Cursors.Default
    End Sub

    Private Sub ToonAanmaakBarcodesScherm()
        If (Not Utility.CanOpenOtherFormCheck()) Then Return
        Cursor = Cursors.WaitCursor
        Dim f As New AanmaakBarcodesForm(False)
        f.ShowDialog()
        Cursor = Cursors.Default
    End Sub

    Private Sub ToonBeheerWinkeliersScherm()
        If (Not Utility.CanOpenOtherFormCheck()) Then Return
        Cursor = Cursors.WaitCursor
        Dim f As New BeheerWinkeliersForm(Me)
        f.ShowDialog()
        Cursor = Cursors.Default
    End Sub

    Private Sub ToonInstellingen()
        If (Not Utility.CanOpenOtherFormCheck()) Then Return
        Cursor = Cursors.WaitCursor
        Dim f As New SettingsForm(Me)
        f.ShowDialog()
        Cursor = Cursors.Default
    End Sub

    Private Sub ToonToonArtikels()
        If (Not Utility.CanOpenOtherFormCheck()) Then Return
        Cursor = Cursors.WaitCursor
        Dim f As New ToonArtikelsForm(Me)
        f.ShowDialog()
        Cursor = Cursors.Default
    End Sub

    Private Sub ToonBeheerInventaris()
        If (Not Utility.CanOpenOtherFormCheck()) Then Return
        Cursor = Cursors.WaitCursor
        Dim f As New InventarisForm(Me)
        f.ShowDialog()
        Cursor = Cursors.Default
    End Sub

    Private Sub ToonBeheerCategorieen()
        If (Not Utility.CanOpenOtherFormCheck()) Then Return
        Cursor = Cursors.WaitCursor
        Dim f As New BeheerCategorieenForm(Me)
        f.ShowDialog()
        Cursor = Cursors.Default
    End Sub

    Private Sub ToonBeheerLeveranciers()
        If (Not Utility.CanOpenOtherFormCheck()) Then Return
        Cursor = Cursors.WaitCursor
        Dim f As New BeheerLeveranciersForm(Me)
        f.ShowDialog()
        Cursor = Cursors.Default
    End Sub

    Private Sub ToonBeheerVerkopen()
        If (Not Utility.CanOpenOtherFormCheck()) Then Return
        Cursor = Cursors.WaitCursor
        Dim f As New VerkopenForm(Me)
        f.ShowDialog()
        Cursor = Cursors.Default
    End Sub

    Private Sub ToonBeheerKlanten()
        If (Not Utility.CanOpenOtherFormCheck()) Then Return
        Cursor = Cursors.WaitCursor
        Dim f As New BeheerKlantenForm(Me)
        f.ShowDialog()
        Cursor = Cursors.Default
    End Sub

    Private Sub ToonBeheerLeveringsbonnen()
        If (Not Utility.CanOpenOtherFormCheck()) Then Return
        Cursor = Cursors.WaitCursor
        Dim f As New BeheerLeveringsbonnenForm(Me)
        f.ShowDialog()
        Cursor = Cursors.Default
    End Sub

    Private Sub ToonImporteerPrijzen()
        If (Not Utility.CanOpenOtherFormCheck()) Then Return
        Cursor = Cursors.WaitCursor
        Dim f As New ImporteerPrijzenForm(Me)
        f.ShowDialog()
        Cursor = Cursors.Default
    End Sub

    Private Sub BeheerSamengesteldeArtikels()
        If (Not Utility.CanOpenOtherFormCheck()) Then Return
        Cursor = Cursors.WaitCursor
        Dim f As New SamengesteldeArtikelsForm(Me)
        f.ShowDialog()
        Cursor = Cursors.Default
    End Sub

    Private Sub BeheerLeeggoedVanArtikels()
        If (Not Utility.CanOpenOtherFormCheck()) Then Return
        Cursor = Cursors.WaitCursor
        Dim f As New LeeggoedVanArtikelForm(Me)
        f.ShowDialog()
        Cursor = Cursors.Default
    End Sub

    Private Sub ToonToolsScherm()
        If (Not Utility.CanOpenOtherFormCheck()) Then Return
        Cursor = Cursors.WaitCursor
        Dim f As New ToolsForm()
        f.ShowDialog()
        Cursor = Cursors.Default
    End Sub

    Private Sub ToonVerkoopsRapport()
        If (Not Utility.CanOpenOtherFormCheck()) Then Return
        Cursor = Cursors.WaitCursor
        Dim f As New VerkoopsRapportForm(Me)
        If (f.ShowDialog() = DialogResult.OK) Then
            Dim begindatum As Date = f.DateTimePickerBeginDatum.Value
            Dim einddatum As Date = f.DateTimePickerEindDatum.Value
            Dim verkopenVanPeriode As IEnumerable(Of ArtikelsDataSet.VerkopenRow) = From v In Utility.Data.Verkopen _
                                                                                    Where begindatum <= v.Datum And v.Datum <= einddatum _
                                                                                    Select v _
                                                                                    Order By v.Datum
            PrintUtility.PrintVerkoopsrapport(verkopenVanPeriode.ToList())
        End If
        Cursor = Cursors.Default
    End Sub

    Private Sub ToonInventarisRapport()
        Try
            Cursor = Cursors.WaitCursor
            InventarisBL.UpdateLeeggoedVoorVolleFlessen()
            Dim xml As String = InventarisBL.GetInventarisAsXml()
            Utility.GenereerRapport(xml, "Inventaris.docx")
            Dim xml2 As String = InventarisBL.GetInventarisSamenvattingAsXml()
            Utility.GenereerRapport(xml2, "InventarisSamenvatting.docx")
            InventarisBL.RollbackLeeggoedVoorVolleFlessen()
        Catch ex As Exception
            log.WriteError(ex.ToString())
            MessageBox.Show(ex.Message)
        Finally
            Cursor = Cursors.Default
        End Try
    End Sub

    Private Sub ToonArtikelRapport()
        If (Not Utility.CanOpenOtherFormCheck()) Then Return
        Cursor = Cursors.WaitCursor
        Dim f As New ArtikelRapportForm(Me)
        If (Security.IsWinkelierZonderMeerRechten) Then
            f.ShowInTaskbar = False
            f.ShowDialog()
        Else
            f.ShowInTaskbar = True
            f.Show()
        End If
        Cursor = Cursors.Default
    End Sub

    Private Sub ToonVerkoopsoverzicht()
        If (Not Utility.CanOpenOtherFormCheck()) Then Return
        Cursor = Cursors.WaitCursor
        Dim f As New VerkoopsoverzichtForm(Me)
        f.ShowDialog()
        Cursor = Cursors.Default
    End Sub

    Private Sub ToonOnderdelenAfhankelijkVanGebruiker()
        ' security
        Me.GroupBoxBasis.Visible = True
        Me.GroupBoxBasis.Enabled = True
        Me.llNieuwKasblad.Visible = True
        Me.llTussendoor.Visible = True
        Me.llVoorraadbewegingen.Visible = True
        Me.llBeheerVerkopen.Visible = True

        Me.GroupBoxWinkelwerking.Visible = Security.IsWinkelwerking() OrElse Security.IsAdmin()
        Me.llLeveringen.Visible = Security.IsWinkelwerking() OrElse Security.IsAdmin()
        Me.llBarcodes.Visible = Security.IsWinkelwerking() OrElse Security.IsAdmin()
        Me.llInventaris.Visible = Security.IsWinkelwerking() OrElse Security.IsAdmin()

        Me.GroupBoxBeheer.Visible = Security.IsAdmin()
        Me.llBeheerArtikels.Visible = Security.IsAdmin()
        Me.llBeheerCategorieen.Visible = Security.IsAdmin()
        Me.llBeheerLeveranciers.Visible = Security.IsAdmin()
        Me.llBeheerWinkeliers.Visible = Security.IsAdmin()
        Me.llBeheerKlanten.Visible = Security.IsAdmin()
        Me.llTools.Visible = Security.IsAdmin()

        Me.GroupBoxRapporten.Visible = Security.IsWinkelwerking() OrElse Security.IsAdmin()
        Me.llInventarisRapport.Visible = Security.IsWinkelwerking() OrElse Security.IsAdmin()
        Me.llVerkoopsRapport.Visible = Security.IsWinkelwerking() OrElse Security.IsAdmin()
    End Sub

#End Region

End Class
